<?php
/*
Copyright (C) 2009 de Flotte Maxence

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
?>
<?php

//Creation d'un Label
/*
 *	$name: nom du label
 *	$type: le type du label
 *	$date: la date de creation, null pour la date courante
 *	$uOwner: propriétaire
 *	$gOwner: groupe propriétaire
 *
 *	$chmod: droit sur le fichier
 *		On peut utiliser le chmod binaire: x,x,x,x,x,x (user lecture, u. écriture, groupe lect., grp. é., autre lect., a. é.)
 *		Ou des codes:	Normal			11 11 10
 *							EbCanWrite		11 11 11
 *							Private			11 00 00
 *							Restreint		11 10 00
 *							Collaboratif	11 11 00
 *				
 *				
 *	$_parentLabel: Array contenant les labels parents;
 *
 *	RETOUR:
 *		Si tout est ok, retourne l'id du nouveau label
 *		Si un champs est incorrect, retourne FALSE
 *		Si on a pas le droit d'écrire dans l'un des label parents retourne False
 *
 */
function ZzCreateLabel($name,$type,$date,$uOwner,$gOwner,$chmod,$_parentLabel) {
	//Tableau Chmod
		$_chmod['normal'] = '1,1,1,1,1,0';
		$_chmod['ebcanwrite'] = '1,1,1,1,1,1';
		$_chmod['restreint'] = '1,1,1,0,0,0';
		$_chmod['collaboratif'] = '1,1,1,1,0,0';
		$_chmod['private'] = '1,1,0,0,0,0';
	//Verification des champs
	if(sizeof($name) == 0)
		return false;
	if(!isSet($uOwner) or !isSet($gOwner) or !isSet($chmod))
		return false;
	if(!array_key_exists(strToLower($chmod),$_chmod) and !preg_match('!^([01],){5}[01]$!',$chmod))
		return false;
	if($date == null)
		$date = time();
	if(empty($_parentLabel))
		return false;

	//Verrification des droits en écriture dans la/les rubriques parentes parentes
	//Pour cela on compte le nombre de rubrique ou on à la droit en écriture parmis les rubriques parentes. Et si on a pas le droit d'écrire dans toute alors on retourne false.

	//En premier on transforme le tableau parentLabel et group en regex
		if(!empty($_SESSION['group']))
			foreach($_SESSION['group'] AS $key => $grp)
				if($key == 0)
					$listGroup = $grp;
				else
					$listGroup .= '|'.$grp;
		else
			$listGroup = '';

	//On transforme $parentLabel en array
		if(!is_Array($_parentLabel) and $_parentLabel != null)
			$_parentLabel = array($_parentLabel);
			foreach($_parentLabel AS $key => $label)
				if($key == 0)
					$listLabelParent = $label;
				else
					$listLabelParent .= '|'.$label;
	//L'id de l'utilisateur
		if(!empty($_SESSION['user']))
			$user = $_SESSION['user'];
		else
			$user = '0';
	
	//On compte le nombre de parents
		$nbParents1 = count($_parentLabel);
	
	//Si $user = 0, alors la requête ne regarde que les le champs "other"
		if($user == 0)
			$ssreq = '( A.other = 1 )';
	//Si on vérifie tous le groupe et l'utilisateur
		else
		$ssreq = '( A.other = 1 OR A.group REGEXP \'^'.$listGroup.'$\' OR (A.user = 1 AND L.User = '.$user.')  )';
		
	$req = 'SELECT count(*) AS count FROM '.$GLOBALS['prefix'].'label AS L inner join '.$GLOBALS['prefix'].'_autocreate_childs_permissions AS A on A.id=L.id WHERE L.id REGEXP \'^'.$listLabelParent.'$\' AND A.type=? AND '.$ssreq.' ;';

		$res = ZzSQL::queryFirst($req,array($type));
		if($res != null)
			$nbParents2 = intval($res['count']);
		else
			$nbParents2 = 0;

		if($nbParents1 != $nbParents2)
			return false;

		//On transforme le chmod
		if(array_key_exists(strToLower($chmod),$_chmod))
			$chmod = $_chmod[strtolower($chmod)];



		//On peut créer le label
		$req = 'Insert Into '.$GLOBALS['prefix'].'label(name,`type`,dateC,dateU,userR,userW,groupR,groupW,otherR,otherW,user,`group`) Values(?,?,?,?,?,?,?,?,?,?,?,?);';
		$_chmod = explode(',',$chmod);
		ZzSQL::exec($req,array($name,strToLower($type),$date,$date,$_chmod[0],$_chmod[1],$_chmod[2],$_chmod[3],$_chmod[4],$_chmod[5],$uOwner,$gOwner));

		//On rècupère l'id du label
		$last_id = ZzSQL::lastInsertId();
		//On met à jours les DateU de toute les rubriques parente et on enregiste la hierarchie
		$lenthParentLabel = count($_parentLabel);
		for($i = 0;$i<$lenthParentLabel;$i++) {
			cleanZzG($_parentLabel[$i],true);
			if($i<$lenthParentLabel-1)
				@$ssReq .= 'id='.$_parentLabel[$i].' OR ';
			else
				@$ssReq .= 'id='.$_parentLabel[$i];
			$req = 'INSERT INTO '.$GLOBALS['prefix'].'_label(id_father, id_son) VALUES(?,?);';
		ZzSQL::exec($req,array($_parentLabel[$i],$last_id));
		}
		//$req = 'UPDATE ZzLabel SET DateU='.time().' WHERE '.$ssReq.';'
		if($GLOBALS['store']) {
			$_res['name'] = $name;
			$_res['type'] = $type;
			$_res['dateC'] = $date;
			$_res['dateU'] = $date;
			$_res['user'] = $uOwner;
			$_res['group'] = $gOwner;
			$_chmod = explode(',',$chmod);
			$_chmodName = array('userR', 'userW', 'groupR', 'groupW', 'otherR', 'otherW');
			foreach($_chmodName as $key => $val)
				$_res[$val] = $_chmod[$key];
			file_put_contents('./ZzStore/'.$last_id.'.php',serialize($_res));
		}

		//On retourne l'id
		return $last_id;
}

//Modification d'un Label
/*
 *	$id: l'id du label
 *	$name: le nouveau nom du label
 *	$date: la nouvelle date de création (si nulle, elle sera inchangé)
 *
 *	$parentLabel: Array contenant les labels nouveaux parents; Cette argument à été supprimé
 *
 *	RETOUR:
 *		Si tout est ok, retourne TRUE
 *		Si un champs est incorrect, retourne FALSE
 *		Si on a pas le droit d'écrire dans l'un des labels parents (ancien ou nouveau), retourne False
 *
 */
function ZzUpdateLabel($id,$name,$date,$parentLabel = null) {

	if($GLOBALS['store'] and file_exists('./ZzStore/'.$id.'.php'))
		$_res = unserialize(file_get_contents('./ZzStore/'.$id.'.php'));
	else
		$_res = array();
	if(!is_numeric($id))
		return false;
		
	//On verifie qu'on a le droit de modifier le label
		//En premier on transforme le tableau des groupes en regex
			if(!empty($_SESSION['group']))
				foreach($_SESSION['group'] AS $key => $grp)
					if($key == 0)
						$listGroup = $grp;
					else
						$listGroup .= '|'.$grp;
			else
				$listGroup = '';
		//L'id de l'utilisateur
			if(!empty($_SESSION['user']))
				$user = $_SESSION['user'];
			else
				$user = '0';
		//Si $user = 0, alors la requête ne regarde que les le champs "other"
			if($user == 0)
				$ssreq = '( L.otherW = 1 )';
		//Si on vérifie tous le groupe et l'utilisateur
			else
				$ssreq = '(L.otherW = 1 OR (L.group REGEXP \'^'.$listGroup.'$\' AND L.groupW = 1) OR (L.user = 1 AND L.userW = '.$user.')  )';
		
		$req = 'SELECT count(*) AS count FROM '.$GLOBALS['prefix'].'label AS L WHERE L.id = ? AND '.$ssreq.' ;';
		$res = ZzSQL::query($req,array($id));

		if($res != null)
			$res = intval($res['count']);
		else
			$res = 0;
	$args = array();
	//On enregistre les modifications
	$ssreq = '';
	if(!empty($date)) {
		$ssreq .= ', dateC=:dateC';
		$_res['dateC'] = $date;
		$args['dateC'] = $date;
	}
	if(!empty($name)) {
		$ssreq .= ', name=:name';
		$_res['name'] = $name;
		$args['name'] = $name;
	}

	//if(!empty($puzzle))
	//	@$ssreq .= ', puzzle=\''.$puzzle.'\'';

	$req = 'UPDATE '.$GLOBALS['prefix'].'label SET dateU=:dateU'.$ssreq.' WHERE Id = :id;';
	$args['id'] = $id;
	$args['dateU'] = time();
	ZzSQL::exec($req,$args);

	//On supprime les fichier caches des rubriques parentes
		$refFile = './ZzStore/ref'.$id.'.php';
		if(file_exists($refFile)) {
			$_ref = unserialize(file_get_contents($refFile));
			foreach($_ref as $lid) {
				cleanZzG($lid);
			}
		}
	
	//On supprime les fichiers cache du label.
		cleanZzG($id,true);

	if($GLOBALS['store'] and file_exists('./ZzStore/'.$id.'.php'))
		file_put_contents('./ZzStore/'.$id.'.php',serialize($_res));
	return true;
}

//Vide les dossiers de cache
function cleanZzG($label,$all = false) {
	
	if($label != null) {
		//On ouvre le fichier log
			//On creer le fichier log si il n'existe pas & on le récupère dans la variable _tree
				if(!file_exists($GLOBALS['cwd'].'/ZzG/tree.log')) {
					$_tree['totalSize'] = 0;
					file_put_contents('./ZzG/tree.log', serialize($_tree));
				}
				else
					$_tree = unserialize(file_get_contents($GLOBALS['cwd'].'/ZzG/tree.log'));

		//
		$path = '';
		if(!is_numeric($label)) {
			$_label = explode('-',$label);
			$label = $_label[0];
			for($i = 1; $i < count($_label);$i++)
				$path .= $_label[$i];
		}

		$addr = $GLOBALS['cwd'].'/ZzG/'.$label;
		//À verifier
		//$addr2 = './ZzG/'.$label;
		if(is_dir($addr)) {
			if($dir = opendir($addr))
				while($file = readdir($dir)) { 
					if($file != '..' and $file !='.' and (preg_match('!^'.$path.'_altPuZZle_(.*)-lang_(.*).php!',$file) or $all)) {
						if(isSet($_tree[$addr2 . '/' . $file])) {
							$_tree['totalSize'] -= filesize($addr . '/' . $file);
							unset($_tree[$addr2 . '/' . $file]);
						}
						unlink($addr . '/' . $file); 
					}
				}
			closedir($dir);
		}
		file_put_contents($GLOBALS['cwd'].'/ZzG/tree.log', serialize($_tree));
	}
}

//Change les propriétères du labe
function ZzChOwners($lid,$uOwner,$gOwner) {
	if(!is_numeric($lid))
		return false;

	//Recupèration du user et group propriétère du label 
		$req = 'SELECT user, `group` FROM '.$GLOBALS['prefix'].'label WHERE id= ?';
		$_data = ZzSQL::queryFirst($req,array($lid));
		if($_data == null)
			return false;
		//Si on est le propriétère
			if($_SESSION['user'] == $_data['user'])
				$req = 'UPDATE '.$GLOBALS['prefix'].'label SET user = ?, `group` = ? WHERE id = ?';
			else
				return false;
		//Tout est ok on fait la requête est on retourne true
			if(ZzSQL::exec($req,array($uOwner,$gOwner,$lid)) != 0)
				return true;
			else
				return false;

}

?>